package com.albertyjz.juc;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//多线程编程举例。三个售票员买票30张。
//runnable是一个接口，可以通过匿名内部类方法new这个接口,来实现接口中的方法。
//synchronized是一种同步锁，它有一个弊端，锁住后里面的内容全部锁住了。
class Ticket{
    private int number=30000;
    public synchronized void saleTicket(){
        if(number>0){
            System.out.println(Thread.currentThread().getName()+"\t卖出第："+(number--)+"\t还剩下："+number);
        }
    }

    private Lock lock=new ReentrantLock();
    public void saleTicket1(){
        lock.lock();
        try {
            if(number>0){
                System.out.println(Thread.currentThread().getName()+"\t卖出第："+(number--)+"\t还剩下："+number);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}
public class SaleTicket{
    public static void main(String[] args) throws Exception{
        Ticket ticket=new Ticket();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=1;i<=30000;i++){
                    ticket.saleTicket1();
                }
            }
        },"A").start();

        //lamda表达式，因为这个接口里面只有一个方法，简称函数式接口，可以用。函数式接口可以表明注解@FunctionalInterface（不标底层会表）
        new Thread(()->{for (int i=1;i<=30000;i++) ticket.saleTicket1(); },"B").start();
    }
}
